#include "AsignadorDeCaja.h"

AsignadorDeCaja::AsignadorDeCaja(vector<Empleado>& empleados,
		Administrador& admin, bool logActivo) :
		Proceso("AsignCaja", logActivo), empleados(empleados), admin(admin), semaforoUtilizandoCaja(
				Constantes::ARCHIVO_SEMAFORO_CAJA, 1, 1), colaMensajesCaja(Constantes::ARCHIVO_COLA_MENSAJES_CAJA,'a') {

}

AsignadorDeCaja::~AsignadorDeCaja() {

}

void AsignadorDeCaja::run() {
	// event handler para la senial SIGINT (-2)
	SIGINT_Handler sigint_handler;
	// se registra el event handler declarado antes
	SignalHandler::getInstance()->registrarHandler(SIGINT, &sigint_handler);
	MensajePeticionCaja buffer;
	// TODO: loggear todo
	while (sigint_handler.getGracefulQuit() == 0) {
		// Espero hasta poder usar la caja (por si alguien la esta usando)
		semaforoUtilizandoCaja.p();
		// Intento leer al administrador de la cola de mensajes (no bloqueante)
		if (colaMensajesCaja.leerNoBloqueante(admin.getPrioridadCaja(),&buffer)!=-1) {
			admin.getSemaforoPeticionCaja().v();
			continue;
		}
		// Si no pude leer al admin, intento leer al proximo (empleado o admin) (bloqueante) (0 en el par)
		if( colaMensajesCaja.leerBloqueante(0,&buffer)!=-1) {
			if(buffer.mtype == 0) {
				// Lei al admin
				admin.getSemaforoPeticionCaja();
			}
			else {
				// Lei un empleado, desbloqueo al empleado correspondiente. nemp se encuentra en esa pos del vector
				empleados.at(buffer.idDemandanteDeCaja).getSemaforoPeticionCaja().v();
			}
			continue;
		}
		break; // Si llegue a este break es porque hubo un error, termino el while

	}
	SignalHandler::destruir();
}
